import { MedicalDocument, MedicalElement, MedicalText } from '../types/medicalTypes';
import { toFhirFormat, fromFhirFormat } from './medicalFormat';

/**
 * 导出医疗文档为JSON文件
 * @param document 医疗文档内容
 * @param fileName 文件名
 * @param format 导出格式 ('json' | 'fhir')
 */
export const exportDocument = (
  medicalDoc: MedicalDocument,  // 修改参数名
  fileName: string = 'medical-record',
  format: 'json' | 'fhir' = 'json'
): void => {
    // 清理文件名中的非法字符
    fileName = fileName.replace(/[^a-z0-9\-]/gi, '_');
  let content: string;
  let contentType: string;
  
  if (format === 'fhir') {
    const fhirData = toFhirFormat(medicalDoc);  // 使用新参数名
    content = JSON.stringify(fhirData, null, 2);
    contentType = 'application/fhir+json';
    fileName = `${fileName}.fhir.json`;
  } else {
    content = JSON.stringify(medicalDoc, null, 2);  // 使用新参数名
    contentType = 'application/json';
    fileName = `${fileName}.json`;
  }
  
  // 创建Blob对象
  const blob = new Blob([content], { type: contentType });
  
  // 创建下载链接
  const link = document.createElement('a');
  link.href = URL.createObjectURL(blob);
  link.download = fileName;
  
  // 触发下载
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
};

/**
 * 导入医疗文档
 * @param file 上传的文件
 * @param format 文件格式 ('json' | 'fhir')
 * @returns 解析后的医疗文档
 */
export const importDocument = async (
  file: File,
  format: 'json' | 'fhir' = 'json'
): Promise<MedicalDocument> => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    
    reader.onload = (event) => {
      try {
        if (!event.target?.result) {
          throw new Error('文件内容为空');
        }
        
        const content = event.target.result.toString();
        let document: MedicalDocument;
        
        if (format === 'fhir') {
          const fhirData = JSON.parse(content);
          document = fromFhirFormat(fhirData);
        } else {
          document = JSON.parse(content) as MedicalDocument;
        }
        
        resolve(document);
      } catch (error) {
        reject(new Error(`文件解析失败: ${(error as Error).message}`));
      }
    };
    
    reader.onerror = () => {
      reject(new Error(`文件读取失败: ${reader.error?.message}`));
    };
    
    reader.readAsText(file);
  });
};

/**
 * 导出文档为PDF
 * @param document 医疗文档内容
 * @param fileName 文件名
 */
export const exportToPDF = async (
  document: MedicalDocument,
  fileName: string = 'medical-record.pdf'
): Promise<void> => {
  // 注意：此功能需要额外的PDF生成库（如jsPDF或html2pdf）
  // 这里仅提供示例框架
  
  try {
    // 1. 将医疗文档转换为HTML格式
    const htmlContent = convertDocumentToHTML(document);
    
    // 2. 使用PDF生成库创建PDF
    const pdf = await generatePDF(htmlContent);
    
    // 3. 触发下载
    pdf.save(fileName);
  } catch (error) {
    throw new Error(`PDF导出失败: ${(error as Error).message}`);
  }
};

/**
 * 将医疗文档转换为HTML（用于打印或导出PDF）
 * @param document 医疗文档
 * @returns HTML字符串
 */
export const convertDocumentToHTML = (document: MedicalDocument): string => {
  let html = '<div class="medical-document">';
  
  document.forEach(element => {
    const firstChild = element.children[0];
    const textContent = isMedicalText(firstChild) ? 
      escapeHtml(firstChild.text) : ''; 
    
    switch (element.type) {
        case 'heading':
          html += `<h1>${textContent}</h1>`;
          break;
        
        case 'chief-complaint':
          html += `
            <div class="medical-section">
              <h2>主诉</h2>
              <p>${textContent}</p>
            </div>
          `;
          break;
        
        case 'present-illness':
          html += `
            <div class="medical-section">
              <h2>现病史</h2>
              <p>${textContent}</p>
            </div>
          `;
          break;
      // 其他章节类型...
      
      default:
        html += `<p>${textContent}</p>`;
    }
  });
  
  html += '</div>';
  return html;
};
// 添加HTML转义函数
function escapeHtml(unsafe: string): string {
    return unsafe
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;")
      .replace(/'/g, "&#039;");
  }
/**
 * 生成PDF（需要集成PDF库）
 * @param htmlContent HTML内容
 * @returns PDF对象
 */
const generatePDF = async (htmlContent: string): Promise<any> => {
    throw new Error('请先安装html2pdf.js或jsPDF库');
  // 实际实现需要集成PDF生成库
  // 例如使用jsPDF或html2pdf.js
  
  // 示例使用html2pdf.js
  // 注意：需要先安装 html2pdf.js
  // import html2pdf from 'html2pdf.js';
  
  // return new Promise((resolve) => {
  //   const opt = {
  //     margin: 10,
  //     filename: 'medical-record.pdf',
  //     image: { type: 'jpeg', quality: 0.98 },
  //     html2canvas: { scale: 2 },
  //     jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }
  //   };
    
  //   html2pdf().from(htmlContent).set(opt).save();
  //   resolve();
  // });
  
  throw new Error('PDF生成功能需要额外的库支持');
};

/**
 * 检查文件是否为支持的格式
 * @param file 文件
 * @returns 是否支持
 */
export const isSupportedFile = (file: File): boolean => {
  const supportedTypes = ['application/json', 'application/fhir+json'];
  const supportedExtensions = ['.json', '.fhir.json'];
  
  return (
    supportedTypes.includes(file.type) ||
    supportedExtensions.some(ext => file.name.toLowerCase().endsWith(ext))
  );
};

// 修复 isMedicalText 类型守卫实现
function isMedicalText(node: MedicalElement | MedicalText): node is MedicalText {
  return node && 'text' in node;
}
